import router from './index'
import { useUserStore } from '@/stores/user'
import { hasAccess, getToken} from '@/utils/accessUtil'
import { Message } from '@arco-design/web-vue'

// 添加全局前置守卫
router.beforeEach(async (to, from, next) => {
  // 获取用户存储
  const userStore = useUserStore()

  // 获取路由是否需要登录
  const needLogin = to.meta.isLogin

  // 获取路由需要的权限
  const accessPermission = to.meta.access as string | undefined
  
  // 检查本地缓存中是否有token
  const token = getToken()
  const hasToken = !!token
  
  // 检查是否已有用户信息
  const hasUserInfo = !!userStore.userInfo
  
  // 如果用户已登录且尝试访问登录页，重定向到首页
  if ((hasToken && hasUserInfo) && to.path === '/login') {
    Message.info('您已登录，无需重复登录')
    next({ path: '/', replace: true })
    return
  }
  
  // 根据不同情况处理
  if (hasToken) {
    // 1. 本地缓存有token，但用户信息为空，需要请求用户信息
    if (!hasUserInfo) {
      try {
        const userInfo = await userStore.getUserInfo()
        if (!userInfo) {
          Message.error('获取用户信息失败，请重新登录')
          // token可能已失效，清除token后重定向到登录页
          userStore.logout()
          next({ path: '/login', replace: true })
          return
        }
        
        // 如果获取用户信息成功，且目标是登录页，则重定向到首页
        if (to.path === '/login') {
          Message.info('您已登录，无需重复登录')
          next({ path: '/', replace: true })
          return
        }
      } catch (error) {
        console.error('获取用户信息失败', error)
        Message.error('获取用户信息失败，请重新登录')
        userStore.logout()
        next({ path: '/login', replace: true })
        return
      }
    }
    
    // 2. 本地缓存有token且用户信息不为空，无需请求用户信息
    // 继续校验权限
    if (accessPermission) {
      // 4. 检查用户是否有权限访问该路由
      if (hasAccess(userStore.userInfo, accessPermission)) {
        next()
      } else {
        Message.error(`您没有访问该页面的权限`)
        console.warn(`用户没有访问${to.path}的权限: 需要 ${accessPermission}`)
        next({ path: '/', replace: true })
      }
      return
    }
    
    // 不需要特定权限，直接放行
    next()
    return
  } else {
    // 3. 本地缓存中不存在token
    if (needLogin) {
      // 需要登录但未登录，重定向到登录页并提示
      Message.warning('请先登录')
      console.warn(`访问${to.path}需要登录`)
      next({ path: '/login', query: { redirect: to.fullPath }, replace: true })
      return
    }
    
    // 不需要登录，直接放行
    next()
  }
})

export default router